<?php
// +----------------------------------------------------------------------
// | Name 风音框架
// +----------------------------------------------------------------------
// | Author 唐启云 <tqy@fxri.net>
// +----------------------------------------------------------------------
// | Copyright Copyright © 2016-2099 方弦研究所. All rights reserved.
// +----------------------------------------------------------------------
// | Link https://www.fxri.net
// +----------------------------------------------------------------------

namespace fxsafe\facade;

/**
 * 文本类
 */
class Text
{
    /**
     * 处理字符串-编码
     * @param array $data 数据
     * @return string
     */
    public function strEncode($data)
    {
        // 初始化变量
        $echo = [];
        // 校验数据
        if (!is_array($data)) return $data;
        // 解析数据
        foreach ($data as $key => $value) {
            // 解析数据
            $value = $this->strEncodeMerge($value);
            // 疏理数据
            foreach ($value as $value2) {
                $echo[] = $key . $value2;
            }
        }
        $echo = implode('&', $echo);
        return $echo;
    }

    /**
     * 处理字符串-编码-合并数组
     * @param array $data 数据
     * @return array
     */
    public function strEncodeMerge($data)
    {
        // 初始化变量
        $tray = [];
        // 校验数据
        if (!is_array($data)) {
            $data = urlencode($data);
            return ['=' . $data];
        }
        // 解析数据
        foreach ($data as $key => $value) {
            $value = $this->strEncodeMerge($value);
            foreach ($value as $value2) {
                if (array_keys($data) != array_flip(array_keys($data))) {
                    $tray[] = '[' . $key . ']' . $value2;
                } else {
                    $tray[] = '[]' . $value2;
                }
            }
        }
        return $tray;
    }

    /**
     * 处理字符串-解码
     * @param string $data 数据
     * @return array
     */
    public function strDecode($data)
    {
        // 初始化变量
        $echo = [];
        // 校验数据
        if (is_array($data)) return $data;
        // 解析数据
        $data = explode('&', $data);
        foreach ($data as $key => $value) {
            // 解析数据
            $value = explode('=', $value, 2);
            $predefined = [
                // 键名
                0,
                // 键值
                1,
            ];
            $value = \fxsafe\Param::define([$value, $predefined], '1.2.1');
            if (is_blank($value[0]) && is_null($value[1])) continue;
            // 疏理数据
            $value[0] = !is_null($value[0]) ? urldecode($value[0]) : $value[0];
            $value[1] = !is_null($value[1]) ? urldecode($value[1]) : $value[1];
            // 解析键名
            $value[0] = preg_replace('/^([^\[]*)/', '[$1]', $value[0]);
            $value[2] = $echo;
            $value = $this->strDecodeMerge($value);
            // 合并数据
            $echo = \fxsafe\Param::merge($echo, $value[2]);
        }
        return $echo;
    }

    /**
     * 处理字符串-解码-合并数组
     * @param array $data 数据
     * @return array
     */
    public function strDecodeMerge($data)
    {
        // 初始化变量
        $tray = [];
        $tray['find'] = '^\[([^\]]*)\]';
        preg_match('/' . $tray['find'] . '/', $data[0], $tray['key']);
        $data[0] = preg_replace('/^\\[[^\\]]*\\]/', '', $data[0]);
        if (empty($tray['key'])) {
            return [];
        }
        // 解析数据
        $data[2] = !is_null($data[2]) ? $data[2] : [];
        if ($tray['key'][0] == '[]') {
            $tray['key'][1] = -1;
            foreach ($data[2] as $key => $value) {
                if (!is_numeric($key) || floor($key) != $key) continue;
                $tray['key'][1] = $tray['key'][1] > $key ? $tray['key'][1] : $key;
            }
            $tray['key'][1]++;
        }
        // 疏理数据
        if (!empty(preg_match('/' . $tray['find'] . '/', $data[0]))) {
            $data[2][$tray['key'][1]] = isset($data[2][$tray['key'][1]]) ? $data[2][$tray['key'][1]] : null;
            $data[2][$tray['key'][1]] = $this->strDecodeMerge([$data[0], $data[1], $data[2][$tray['key'][1]]]);
            $data[2][$tray['key'][1]] = isset($data[2][$tray['key'][1]][2]) ? $data[2][$tray['key'][1]][2] : null;
        } else {
            $data[2][$tray['key'][1]] = $data[1];
        }
        return $data;
    }

    /**
     * 解析IPv4
     * @param mixed $data 数据
     * @param string $type 类型
     * @return mixed
     */
    public function ipv4($data, $type)
    {
        // 初始化变量
        $type = strtolower($type);
        switch ($type) {
            case 'encode':
                // 编码
                $data = explode('.', $data);
                foreach ($data as $key => $value) {
                    $value = ltrim($value, 0);
                    if ($value == '') {
                        $value = '0';
                    }
                    $data[$key] = $value;
                }
                $data = implode('.', $data);
                $data = ip2long($data);
                if ($data !== false) {
                    $data = bindec(decbin($data));
                }
                break;
            case 'decode':
                // 解码
                $data = long2ip($data);
                break;
        }
        return $data;
    }
}
